%tkz-obj-eu-show.tex
% Copyright 2020  Alain Matthes
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status “maintained”.
%
% The Current Maintainer of this work is Alain Matthes.
%  utf8 encoding
\def\fileversion{3.06c}
\def\filedate{2020/04/06}
\typeout{2020/04/06 3.06c tkz-obj-eu-show.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% finding specific points in a triangle
%<--------------------------------------------------------------------------–>
%                            equi points
%<--------------------------------------------------------------------------–>
% draw  ? show ?
\pgfkeys{/tkzEquiPt/.cd,
    from/.store in      = {\tkz@frompoint},
    dist/.store in      = {\tkz@equ@dist},
    show/.is if         = tkz@equi@show,
    dist        = 2,
    show        = false,
     /tkzEquiPt/.search also={/tikz}
}

\def\tkzDefEquiPoints{\pgfutil@ifnextchar[{\tkz@DefEquiPoints}{%
                                           \tkz@DefEquiPoints[]}}
\def\tkz@DefEquiPoints[#1](#2,#3){%
\pgfqkeys{/tkzEquiPt}{#1}
\begingroup
   \tkzUProjection(#2,#3)(\tkz@frompoint)
   \pgfnodealias{tkzEQpoint}{tkzPointResult}
   \tkzVecKNorm[\tkz@equ@dist](tkzEQpoint,#2)
   \pgfnodealias{tkzFirstPointResult}{tkzPointResult}
   \tkzVecKNorm[-\tkz@equ@dist](tkzEQpoint,#2)
   \pgfnodealias{tkzSecondPointResult}{tkzPointResult}
   \iftkz@equi@show
      \tkzCompass[#1](\tkz@frompoint,tkzFirstPointResult)
      \tkzCompass[#1](\tkz@frompoint,tkzSecondPointResult)
   \fi
\endgroup
}

%<---------------------------    The SHOW   --------------------------------–>
%<--------------------------------------------------------------------------–>
\global\def\tkz@numsh{0}
\pgfkeys{/show/.cd,
    mediator/.code             =          \def\tkz@numsh{0},
    perpendicular/.code args   =  {through #1} {\global\def\tkz@numsh{1}%
                                              \def\tkz@through{#1}},
    orthogonal/.code args      =  {through #1} {\global\def\tkz@numsh{1}%
                                                \global\def\tkz@through{#1}},
    parallel/.code args         = {through #1} {\global\def\tkz@numsh{2}%
                                            \global\def\tkz@through{#1}},
    bisector/.code                =           \global\def\tkz@numsh{3},
    K/.code                     =   \def\tkz@koeff{#1},
    length/.code                =   \def\tkz@show@length{#1},
    ratio/.code                 =   \def\tkz@show@ratio{#1},
    gap/.code                   =   \def\tkz@show@gap{#1},
    size/.code                  =   \def\tkz@show@size{#1},
    /show/.unknown/.code        =   {\let\searchname=\pgfkeyscurrentname
                                   \pgfkeysalso{\searchname/.try=#1,
                                   /tkzcompass/\searchname/.retry=#1,
                                   /tikz/\searchname/.retry=#1}%
                   }
         }
\def\tkzShowLine{\pgfutil@ifnextchar[{\tkz@ShowLine}{\tkz@ShowLine[]}}
\def\tkz@ShowLine[#1](#2){%
\begingroup
\pgfqkeys{/show}{ K   = 1,
          gap   = 2,
          ratio = .5,
          length  = 1,
          size  = 1
          }
\pgfqkeys{/show}{#1}
\ifcase\tkz@numsh%
 % first case 0
  \tkzShowMediatorLine[#1](#2)
 \or% 1
  \tkzShowOrthLine[#1](#2)(\tkz@through)
 \or% 2
   \tkzShowLLLine[#1](#2)(\tkz@through)
 \or% 3
  \tkzShowBisectorLine[#1](#2)
\fi
\endgroup
}

\def\tkzShowMediatorLine{%
  \pgfutil@ifnextchar[{\tkz@ShowMediatorLine}{\tkz@ShowMediatorLine[]}}
\def\tkz@ShowMediatorLine[#1](#2,#3){%
\begingroup
\pgfkeys{show/.cd,  gap    =  2,
          ratio  =  .5,
          length =  1
    }
\pgfkeys{show/.cd,#1}
  \path (#2) -- (#3) coordinate[pos=.5](tkzmidpoint);
  \tkzURotateAngle(#2,60)(#3)
  \pgfnodealias{tkzFirstPointResult}{tkzPointResult}
  \tkzURotateAngle(#3,60)(#2)
  \pgfnodealias{tkzSecondPointResult}{tkzPointResult}
  \tkz@VecKOrthNorm[1](tkzmidpoint,#2)
   \pgfnodealias{MED@tmp1}{tkzPointResult}
  \tkz@VecKOrthNorm[1](tkzmidpoint,#3)
  \pgfnodealias{MED@tmp2}{tkzPointResult}
  \tkz@VecKNorm[\tkz@show@gap](tkzmidpoint,MED@tmp1)
  \pgfnodealias{MED@1}{tkzPointResult}
  \tkz@VecKNorm[\tkz@show@gap](tkzmidpoint,MED@tmp2)
   \pgfnodealias{MED@2}{tkzPointResult}
  \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#2,MED@1)
  \tkzCompass[#1](#3,MED@1)
  \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#2,MED@2)
  \tkzCompass[#1](#3,MED@2)
\endgroup
}
\def\tkzShowLLLine{\pgfutil@ifnextchar[{\tkz@ShowLLLine}{\tkz@ShowLLLine[]}}
\def\tkz@ShowLLLine[#1](#2,#3)(#4){%
\begingroup
\pgfkeys{show/.cd,gap=2,ratio=.75,length=1}
\pgfkeys{show/.cd,#1}
    \tkz@VecKCoLinear[1](#2,#3,#4)
     \pgfnodealias{tkz@lltmp}{tkzPointResult}
    \tkzCompass[#1](#4,tkz@lltmp)
    \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#3,tkz@lltmp)
\endgroup
}

%<--------------------------------------------------------------------------–>
%                        tkzLineOrth
%<--------------------------------------------------------------------------–>
% pas de projection ortho car le point peut être sur la droite.
% manque les tests . Il faudrait voir si on peut projeter et choisir
\def\tkzShowOrthLine{\pgfutil@ifnextchar[{\tkz@ShowOrthLine}{\tkz@ShowOrthLine[]}}
\def\tkz@ShowOrthLine[#1](#2,#3)(#4){%
\begingroup
\pgfkeys{show/.cd,
          ratio   = .75,
          length  = 1,
          gap     = -1,
          size    = 1}
\pgfkeys{show/.cd,#1}
    \tkzDefPointWith(#2,#3)
    \pgfnodealias{tkz@OLtmp}{tkzPointResult}
    \tkz@VecKCoLinear[1](#2,tkz@OLtmp,#4)
    \pgfnodealias{tkzPointCo}{tkzPointResult}
    \tkzInterLL(#2,#3)(#4,tkzPointCo)
    \pgfnodealias{tkzPOpoint}{tkzPointResult}
    \tkzCalcLength(#4,tkzPOpoint)
    \tkzGetLength{tkz@mathLen}
    \tkz@VecKNorm[1](#2,#3)
    \pgfnodealias{PO@tmp}{tkzPointResult}
    \tkz@VecKCoLinear[1](#2,PO@tmp,tkzPOpoint)
    \pgfnodealias{PO@tmp2}{tkzPointResult}
    \tkz@VecKCoLinear[-1](#2,PO@tmp,tkzPOpoint)
    \pgfnodealias{PO@tmp1}{tkzPointResult}
    \tkz@VecKCoLinear[\tkz@show@size](tkzPOpoint,PO@tmp1,tkzPOpoint)
    \pgfnodealias{PO@1}{tkzPointResult}
    \tkz@VecKCoLinear[\tkz@show@size](tkzPOpoint,PO@tmp2,tkzPOpoint)
    \pgfnodealias{PO@2}{tkzPointResult}
    \ifdim\tkz@mathLen pt>10 pt\relax
        \tkz@VecKNorm[1](#4,tkzPOpoint)
        \pgfnodealias{PO@tmp1}{tkzPointResult}
      \else
        \tkz@VecKOrthNorm[1](tkzPOpoint,PO@2)
        \pgfnodealias{PO@tmp1}{tkzPointResult}
     \fi
    \tkz@VecKCoLinear[-\tkz@show@gap](PO@tmp1,tkzPOpoint,tkzPOpoint)
    \pgfnodealias{PO@3}{tkzPointResult}
    \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](#4,PO@1)
    \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](#4,PO@2)
    \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](PO@1,PO@3)
    \tkzCompass[#1,length=\tkz@show@length](PO@2,PO@3)
\endgroup
}
%<-------------------------------------------------------------------------–>
%    bisector Line
%<-------------------------------------------------------------------------–>
\def\tkzShowBisectorLine{%
    \pgfutil@ifnextchar[{\tkz@ShowBisectorLine}{\tkz@ShowBisectorLine[]}}
\def\tkz@ShowBisectorLine[#1](#2,#3,#4){%
\begingroup
\pgfkeys{show/.cd,  gap   = 2,
          ratio =.  5,
          length  = 1,
          size  = 1}
\pgfkeys{show/.cd,#1}
  \tkzVecKNorm(#3,#2)
    \pgfnodealias{tkz@pt1}{tkzPointResult}
  \tkzVecKNorm(#3,#4)
    \pgfnodealias{tkz@pt2}{tkzPointResult}
  \tkzDefMidPoint(tkz@pt1,tkz@pt2)
    \pgfnodealias{tkz@pt3}{tkzPointResult}
  \tkzDefEquilateral(tkz@pt2,tkz@pt1)
    \pgfnodealias{tkz@pt4}{tkzPointResult}
  \tkzDefMidPoint(tkz@pt3,tkz@pt4)
    \pgfnodealias{tkz@ptm}{tkzPointResult}
  \tkzVecKNorm(#3,tkz@ptm)
    \pgfnodealias{tkzBisPoint}{tkzPointResult}
  \tkzVecKNorm[\tkz@show@size](#3,#2)
    \pgfnodealias{BI@1}{tkzPointResult}
  \tkzVecKNorm[\tkz@show@size](#3,#4)
    \pgfnodealias{BI@2}{tkzPointResult}
  \tkzVecK[\tkz@show@gap](#3,tkzBisPoint)
    \pgfnodealias{tkzBisPoint}{tkzPointResult}
  \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](#3,BI@1)
  \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](#3,BI@2)
  \tkzCompass[#1,length=\tkz@show@length](BI@1,tkzBisPoint)
  \tkzCompass[#1,length=\tkz@show@ratio *\tkz@show@length](BI@2,tkzBisPoint)
\endgroup
}
%<--------------------------------------------------------------------------–>
%                        Transformations Géométriques
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
%                   The SHOW
%<--------------------------------------------------------------------------–>
\def\tkz@numst{0}
\pgfkeys{/showtsf/.cd,
 reflection/.code args={over #1--#2}{%
                  \def\tkzdeb{#1}
                  \def\tkzfin{#2}
                  \def\tkz@numst{0}},
 symmetry/.code args={center #1}{%
                  \def\tkzcenter{#1}
                  \def\tkz@numst{1}},
 projection/.code args={onto #1--#2}{%
                  \def\tkzdeb{#1}
                  \def\tkzfin{#2}
                  \def\tkz@numst{2}},
translation/.code args={from #1 to #2}{%
                  \def\tkzfrom{#1}%
                  \def\tkzto{#2}%
                  \def\tkz@numst{3}},
  K/.code                = \def\tkz@koeff{#1},
  length/.code           = \def\tkz@show@length{#1},
  ratio/.code            = \def\tkz@show@ratio{#1},
  gap/.code              = \def\tkz@show@gap{#1},
  size/.code             = \def\tkz@show@size{#1},
/showtsf/.unknown/.code  = {\let\searchname=\pgfkeyscurrentname
                            \pgfkeysalso{\searchname/.try=#1,
                                /tkzcompass/\searchname/.retry=#1,
                                /tikz/\searchname/.retry=#1}}
}
%<--------------------------------------------------------------------------–>
\def\tkzShowTransformation{\pgfutil@ifnextchar[{\tkz@ShowTransformation}{%
                                                 \tkz@ShowTransformation[]}}
\def\tkz@ShowTransformation[#1](#2){%
\begingroup
 \pgfqkeys{/showtsf}{K=1,gap=2,size=1,ratio=.5,length=1}
 \pgfqkeys{/showtsf}{#1}
 \pgfinterruptboundingbox
\ifcase\tkz@numst%
 % first case 0
  \tkzShowSymOrth[#1](\tkzdeb,\tkzfin)(#2)
  \or% 1
  \tkzShowCSym[#1](\tkzcenter)(#2)
  \or% 2
  \tkzShowProjection[#1](\tkzdeb,\tkzfin)(#2)
  \or% 3
  \tkzShowTranslation[#1](\tkzfrom,\tkzto)(#2)
  \fi
	\endpgfinterruptboundingbox
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzShowTranslation{\pgfutil@ifnextchar[{\tkz@ShowTranslation}{%
                                          \tkz@ShowTranslation[]}}

\def\tkz@ShowTranslation[#1](#2,#3)(#4){%
\begingroup
\tkz@VecKCoLinear[1](#2,#3,#4) \pgfnodealias{tkz@lltmp}{tkzPointResult}
\tkzCompass[#1](#4,tkz@lltmp)
\tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#3,tkz@lltmp)
\endgroup}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzShowSymOrth{\pgfutil@ifnextchar[{\tkz@ShowSymOrth}{%
                                          \tkz@ShowSymOrth[]}}
\def\tkz@ShowSymOrth[#1](#2,#3)(#4){%
\begingroup
  \pgfpointdiff{\pgfpointanchor{#2}{center}}%
               {\pgfpointanchor{#3}{center}}%
  \tkz@ax =\pgf@y%
  \tkz@ay =\pgf@x%
  \path[coordinate](#4)--++(-\tkz@ax,\tkz@ay) coordinate (tkz@point);
  \tkzInterLL(#2,#3)(#4,tkz@point)
  \pgfnodealias{tkzPointofSym}{tkzPointResult}
  \tkz@VecK[2](#4,tkzPointofSym)
  \pgfnodealias{tkz@pointtsf}{tkzPointResult}
  \tkzCompass[#1](#2,#4)
  \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#3,#4)
  \tkzCompass[#1](#2,tkz@pointtsf)
  \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](#3,tkz@pointtsf)
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzShowCSym{\pgfutil@ifnextchar[{\tkz@ShowCSym}{\tkz@ShowCSym[]}}

\def\tkz@ShowCSym[#1](#2)(#3){%
\begingroup
 \pgfpointdiff{\pgfpointanchor{#2}{center}}%
              {\pgfpointanchor{#3}{center}}%
 \tkz@ax=\pgf@x%
 \tkz@ay=\pgf@y%
\path[coordinate](#2)--++(-\tkz@ax,-\tkz@ay) coordinate (tkz@pointtsf);
       \tkzCompass[#1](#2,tkz@pointtsf)
       \tkzCompass[#1](#2,#3)
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzShowProjection{\pgfutil@ifnextchar[{\tkz@ShowProjection}{%
                                          \tkz@ShowProjection[]}}
\def\tkz@ShowProjection[#1](#2,#3)(#4){%
\begingroup
  \pgfpointdiff{\pgfpointanchor{#2}{center}}%
               {\pgfpointanchor{#3}{center}}%
  \tkz@ax =\pgf@y%
  \tkz@ay =\pgf@x%
  \path[coordinate](#4)--++(-\tkz@ax,\tkz@ay) coordinate (tkz@point);
  \tkzInterLL(#2,#3)(#4,tkz@point)
  \pgfnodealias{tkz@pointtsf}{tkzPointResult}
  \tkz@VecKCoLinear[1](#2,#3,tkz@pointtsf)
  \pgfnodealias{SO@tmp1}{tkzPointResult}
  \tkz@VecKCoLinear[-1](#2,#3,tkz@pointtsf)
  \pgfnodealias{SO@tmp2}{tkzPointResult}
  \tkz@VecKNorm[\tkz@show@size](tkz@pointtsf,SO@tmp1)
  \pgfnodealias{SO@1}{tkzPointResult}
  \tkz@VecKNorm[\tkz@show@size](tkz@pointtsf,SO@tmp2)
  \pgfnodealias{SO@2}{tkzPointResult}
  \tkz@VecKNorm[-\tkz@show@gap](tkz@pointtsf,#4)
  \pgfnodealias{SO@3}{tkzPointResult}
  \tkzCompass[#1](#4,SO@1)
  \tkzCompass[#1](#4,SO@2)
  \tkzCompass[#1](SO@1,SO@3)
  \tkzCompass[#1,length=\tkz@show@ratio*\tkz@show@length](SO@2,SO@3)
\endgroup
}
%<-------------------------------------------------------------------------–>
\makeatother
\endinput
